﻿using System.Diagnostics;
using System.Text;

namespace UHIDLInk
{
    /// <summary>
    /// 工具
    /// </summary>
    public static class Utility
    {
        /// <summary>
        /// 累加校验
        /// </summary>
        /// <param name="data">被验数组，不含校验位</param>
        /// <returns>校验位</returns>
        public static byte AddCheck(byte[] data)
        {
            // 初始化累加和为0
            int checksum = 0;

            // 遍历字节数组，逐一累加
            foreach (byte b in data)
            {
                checksum += b;
            }

            // 只保留累加和的低8位
            return (byte)(checksum & 0xFF);
        }

        /// <summary>
        /// 奇偶校验
        /// </summary>
        /// <param name="data">被验数组，不含校验位</param>
        /// <returns>校验位</returns>
        public static byte ParityCheck(byte[] data)
        {
            // 计算所有字节中1的个数
            int countOfOnes = data.Sum(b => BitConverter.ToString([b]).Count(c => c == '1'));
            // 如果1的个数是偶数，则校验位为1，否则为0
            return (byte)(countOfOnes % 2 == 0 ? 1 : 0);
        }

        /// <summary>
        /// 将十六进制字符串转换为字节数组
        /// </summary>
        /// <param name="hexString">表示一串八位十六进制数的字符串</param>
        /// <returns>byte数组</returns>
        /// <exception cref="ArgumentException"></exception>
        public static byte[] HexStringToByteArray(string hexString)
        {
            // 去掉字符串中的空格
            hexString = hexString.Replace(" ", "");

            // 检查字符串长度是否为偶数
            if (hexString.Length % 2 != 0)
            {
                //throw new ArgumentException("十六进制字符串长度应该为偶数");
            }

            // 初始化字节数组
            byte[] byteArray = new byte[hexString.Length / 2];

            // 遍历字符串，每两个字符转换为一个字节
            for (int i = 0; i < byteArray.Length; i++)
            {
                string byteString = hexString.Substring(i * 2, 2);
                byteArray[i] = Convert.ToByte(byteString, 16);
            }

            return byteArray;
        }

        /// <summary>
        /// 将字节数组转换为十六进制字符串
        /// </summary>
        /// <param name="byteArray">byte数组</param>
        /// <returns>表示一串八位十六进制数的字符串</returns>
        public static string ByteArrayToHexString(byte[] byteArray)
        {
            // 初始化StringBuilder以存储十六进制字符串
            StringBuilder hexString = new(byteArray.Length * 2);

            // 遍历字节数组，将每个字节转换为两个十六进制字符
            foreach (byte b in byteArray)
            {
                hexString.AppendFormat("{0:X2} ", b);
            }

            // 去掉末尾多余的空格
            return hexString.ToString().Trim();
        }
    }
}
